/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bomberman.pl.divano.klient;

import bomberman.pl.divano.gra.Gra;
import bomberman.pl.divano.gra.STAŁE;
import bomberman.pl.divano.gra.Zmiany;
import bomberman.pl.divano.server.PARAMETRY;
import bomberman.pl.divano.server.SerwerOdbiorca;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Time;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;




/**
 *
 * @author divano
 */
public class KlientNadawca implements Runnable, PARAMETRY,STAŁE {

    private static Random r = new Random();
    private Socket serwer;
    private Gra bomberman;
    private boolean pętla;
    private ConcurrentLinkedQueue<Zmiany> zmiany;
    //private ObjectInputStream wejscieObiektów;
    private ObjectOutputStream wyjscieObiektów;
    private boolean moznaNadawac;

    private int kierunek;
    private boolean ruch;
    private boolean bomba;

    public KlientNadawca(Gra arg, Socket serwer) {
        moznaNadawac = new Boolean(false);
        bomberman = arg;
        this.serwer = serwer;
        zmiany = new ConcurrentLinkedQueue<Zmiany>();
    }

    public void wyslijObiekt(Object arg) throws IOException {
        Zmiany tmp = (Zmiany)arg;
        try {
            
            wyjscieObiektów.writeObject(arg);
            System.out.println("Wyslano klient"+tmp.getX()+" "+tmp.getTyp()+" "+tmp.getY()+" "+tmp.getKolor());
        } catch (IOException ex) {
            Logger.getLogger(SerwerOdbiorca.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void wykonajRuch(int kierunek){
        this.kierunek = kierunek;
        this.ruch = true;
        //zmiany.add(new Zmiany(bomberman.getAktor().getPozX(),bomberman.getAktor().getPozY(), STAŁE.AKTOR, false, false, kierunek,bomberman.getAktor().getKolor() ));
    }
    public void nieRuch(int kierunek){
        if(this.kierunek == kierunek)  this.ruch = false;
    }
    public void postawBombe(){
        this.bomba = true;
    }

    public void zakoncz(){
        try {
            pętla = true;
            serwer.close();
        } catch (IOException ex) {
            Logger.getLogger(KlientNadawca.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void run() {
        
        try {
            wyjscieObiektów = new ObjectOutputStream(this.serwer.getOutputStream());
            
            Object tmp = null;
            Zmiany cos;
            pętla = true;
            while (pętla) {
               /*if(!zmiany.isEmpty()){
                   wyslijObiekt(zmiany.poll());
                   
               }*/
                
                if(ruch && moznaNadawac){
                    cos  = new Zmiany(bomberman.getAktor().getPozX(),bomberman.getAktor().getPozY(), STAŁE.AKTOR, false, false, this.kierunek,bomberman.getAktor().getKolor() );
                    wyslijObiekt(cos);
                }
                
                if(bomba && moznaNadawac){
                    cos  = new Zmiany(bomberman.getAktor().getPozX(),bomberman.getAktor().getPozY(), STAŁE.KATEGORIA_BOMBA, true, false, 0,bomberman.getAktor().getKolor() );
                    wyslijObiekt(cos);
                    this.bomba = false;
                }
                moznaNadawac = false;
                 


                   //Thread.sleep(STAŁE.SYNCHRONIZACJA);
                TimeUnit.MILLISECONDS.sleep(1);
               
            }
            //a = (Aktor)b;

            serwer.close();
        } catch (Exception e) {
            System.out.println("error connetion");
        }
    }

    /**
     * @return the moznaNadawac
     */
    public boolean isMoznaNadawac() {
        return moznaNadawac;
    }

    /**
     * @param moznaNadawac the moznaNadawac to set
     */
    public void setMoznaNadawac(boolean moznaNadawac) {
        this.moznaNadawac = moznaNadawac;
    }
}
